

%🍁% \chapter{Preface  |  前言}
\chapter{前言}

%🍁%  \section*{The strange history of this book  |  本书与众不同的历史}
\section*{本书与众不同的历史}

%🍁% In January 1999 I was preparing to teach an introductory programming class in Java.  I had taught it three times and I was getting frustrated.  The failure rate in the class was too high and, even for students who succeeded, the overall level of achievement was too low.

1999年1月，我正准备使用Java教一门入门编程课．
这门课之前我已经开过三次， 但是却感到越来越沮丧． 不及格率太高，即便对于及格的学生，他们整体的收获也不大．

%🍁% One of the problems I saw was the books. They were too big, with too much unnecessary detail about Java, and not enough high-level guidance about how to program.  And they all suffered from the trap door effect: they would start out easy, proceed gradually, and then somewhere around Chapter 5 the bottom would fall out.  The students would get too much new material, too fast, and I would spend the rest of the semester picking up the pieces.

我觉得问题之一便是教材．
它们都过于厚重，写了太多无关课程的 Java 细节，而又缺乏关于编程的上层指导 \footnote{上层指导 high-level guidance} ．
这些教材都落入了陷阱门效应\footnote {陷阱门效应 trap door effect}： 开始的时候简单，逐渐深入，然后大概到了第五章左右，基础差的学生就跟不上了．
学生们需要看的材料太多，进展太快，而我却要在接下来的学期里收拾残局\footnote{收拾残局 pick up the pieces}．

%🍁% Two weeks before the first day of classes, I decided to write my own book.  My goals were:

%🍁% \begin{itemize}
%🍁%
%🍁% \item Keep it short.  It is better for students to read 10 pages
%🍁% than not read 50 pages.
%🍁%
%🍁% \item Be careful with vocabulary.  I tried to minimize jargon
%🍁% and define each term at first use.
%🍁%
%🍁% \item Build gradually. To avoid trap doors, I took the most difficult
%🍁% topics and split them into a series of small steps.
%🍁%
%🍁% \item Focus on programming, not the programming language.  I included
%🍁% the minimum useful subset of Java and left out the rest.
%🍁%
%🍁% \end{itemize}

在课两周前，我决定自己写一本书． 我的目标很明确：

\begin{itemize}

\item 尽量简短． 让学生们读10页，胜过让他们读50页．

\item 谨慎使用术语． 我会尽量少用术语，而且第一次使用时，会给出定义．

\item 循序渐进． 为了避免陷阱门，我将最难的主题拆分成了很多个小节．

\item 聚焦于编程，而不是编程语言． 我只涵盖了Java最小可用子集，剔除了其余的部分．

\end{itemize}

%🍁% I needed a title, so on a whim I chose {\em How to Think Like a Computer Scientist}.

所以我需要一个书名，一时兴起我选择了 \emph{《如何像计算机科学家一样思考》}．

%🍁% My first version was rough, but it worked.  Students did the reading, and they understood enough that I could spend class time on the hard topics, the interesting topics and (most important) letting the students practice.

本书的第一版很粗糙， 但却很管用．
学生们读了它之后， 对书中内容理解的很好， 因此我才可以在课堂上讲授那些困难、有趣的主题， 并让学生们动手实践（这点非常重要）．

%🍁% I released the book under the GNU Free Documentation License, which allows users to copy, modify, and distribute the book.

我将此书以 \href{https://en.wikipedia.org/wiki/GNU_Free_Documentation_License}{GNU 自由文档许可} 的形式发布，允许用户拷贝、修改和传播此书．
\index{GNU Free Documentation License} \index{Free Documentation License, GNU}

%🍁% What happened next is the cool part.  Jeff Elkner, a high school teacher in Virginia, adopted my book and translated it into Python.  He sent me a copy of his translation, and I had the unusual experience of learning Python by reading my own book. As Green Tea Press, I published the first Python version in 2001.

接下来有趣的事发生了． 弗吉尼亚一所高中的教师 Jeff Elkne 采用了我的教材， 并改编为基于 \href{http://www.python.org/}{Python 语言}．
当他将修改过的书稿发给我时，我读着自己的书学会了 Python．
2001年，通过Green Tea Press，我出版了本书的第一个 Python 版本．
\index{Elkner, Jeff}

%🍁% In 2003 I started teaching at Olin College and I got to teach Python for the first time. The contrast with Java was striking. Students struggled less, learned more, worked on more interesting projects, and generally had a lot more fun.

2003年，我开始在 \href{http://www.olin.edu/}{Olin College} 教书，并且第一次教授 Python 语言． 与 Java 教学的对比很明显． 学生们遇到的困难更少， 学到的更多， 开发了更有趣的工程， 并且大部分人都学的更开心．
\index{Olin College}

%🍁% Since then I've continued to develop the book,
%🍁% correcting errors, improving some of the examples and
%🍁% adding material, especially exercises.

此后，我一直致力于本书的改善，纠正错误，改进示例，新增教学材料，特别是习题部分．

%🍁% The result is this book, now with the less grandiose title
%🍁% {\em Think Python}.  Some of the changes are:

最后的结果就是你看到的这本书． 而现在的书名没有之前那么夸张， 《Think Python》 ． 下面本书的一些新变化：

%🍁% \begin{itemize}
%🍁%
%🍁% \item I added a section about debugging at the end of each chapter.
%🍁%   These sections present general techniques for finding and avoiding
%🍁%   bugs, and warnings about Python pitfalls.
%🍁%
%🍁% \item I added more exercises, ranging from short tests of
%🍁%   understanding to a few substantial projects.  Most exercises
%🍁%   include a link to my solution.
%🍁%
%🍁% \item I added a series of case studies---longer examples with
%🍁%   exercises, solutions, and discussion.
%🍁%
%🍁% \item I expanded the discussion of program development plans
%🍁%   and basic design patterns.
%🍁%
%🍁% \item I added appendices about debugging and analysis of algorithms.
%🍁%
%🍁% \end{itemize}

\begin{itemize}

\item 我在每章的最后新增了一个名叫调试的小节． 我会在这些小节中，为大家介绍如何发现及避免bug的一般技巧，并提醒大家注意使用Python过程中可能的陷阱．

\item 我增补了更多的练习题，从测试是否理解书中概念的小测试，到部分较大的项目． 大部分的练习题后，我都会附上答案的链接．

\item 我新增了一系列案例研究 —— 更长的代码示例，既有练习题，也有答题解释和讨论．

\item 我扩充了对程序开发计划及基本设计模式的内容介绍．

\item 我增加了关于调试和算法分析的附录．

\end{itemize}

%🍁% The second edition of {\em Think Python} has these new features:
%🍁%
%🍁% \begin{itemize}
%🍁%
%🍁% \item The book and all supporting code have been updated to Python 3.
%🍁%
%🍁% \item I added a few sections, and more details on the web, to help
%🍁% beginners get started running Python in a browser, so you don't have
%🍁% to deal with installing Python until you want to.
%🍁%
%🍁% \item For Chapter~\ref{turtle} I switched from my own turtle graphics
%🍁%   package, called Swampy, to a more standard Python module, {\tt
%🍁%     turtle}, which is easier to install and more powerful.
%🍁%
%🍁% \item I added a new chapter called ``The Goodies'', which introduces
%🍁% some additional Python features that are not strictly necessary, but
%🍁% sometimes handy.
%🍁%
%🍁% \end{itemize}

《Think Python》 第二版还有以下新特点：

\begin{itemize}

\item 本书及其中的代码都已更新至Python 3．

\item 我增加了一些小节内容，还在本书网站上介绍如何在网络浏览器上运行Python． 这样，如果你嫌麻烦的话，就可以先不用在本地安装Python．

\item 在 \hyperref[turtle]{海龟绘图} 小节中，我没有继续使用自己编写的海龟绘图包``Swampy''，改用了一个更标准的Python包 turtle． 这个包更容易安装，功能更强大．

\item 我新增了一个叫 ``The Goodies'' 的章节， 给大家介绍一些严格来说并不是必须了解的 Python 特性， 不过有时候这些特性还是很方便的．

\end{itemize}

%🍁% I hope you enjoy working with this book, and that it helps
%🍁% you learn to program and think like
%🍁% a computer scientist, at least a little bit.

我希望你能愉快的阅读这本书，也希望它能帮助你学习编程，学会像计算机科学家一样思考，至少有那么一点像．

{\em Allen B. Downey} \\

{\em Olin College} \\


\section*{Acknowledgments}

Many thanks to Jeff Elkner, who
translated my Java book into Python, which got this project
started and introduced me to what has turned out to be my
favorite language.
\index{Elkner, Jeff}

Thanks also to Chris Meyers, who contributed several sections
to {\em How to Think Like a Computer Scientist}.
\index{Meyers, Chris}

Thanks to the Free Software Foundation for developing
the GNU Free Documentation License, which helped make
my collaboration with Jeff and Chris possible, and Creative
Commons for the license I am using now.
\index{GNU Free Documentation License}
\index{Free Documentation License, GNU}
\index{Creative Commons}

Thanks to the editors at Lulu who worked on
{\em How to Think Like a Computer Scientist}.

Thanks to the editors at O'Reilly Media who worked on
{\em Think Python}.

Thanks to all the students who worked with earlier
versions of this book and all the contributors (listed
below) who sent in corrections and suggestions.


\section*{Contributor List}

\index{contributors}
More than 100 sharp-eyed and thoughtful readers have sent in
suggestions and corrections over the past few years.  Their
contributions, and enthusiasm for this project, have been a
huge help.

If you have a suggestion or correction, please send email to
{\tt feedback@thinkpython.com}.  If I make a change based on your
feedback, I will add you to the contributor list
(unless you ask to be omitted).

If you include at least part of the sentence the
error appears in, that makes it easy for me to search.  Page and
section numbers are fine, too, but not quite as easy to work with.
Thanks!

\begin{itemize}

\small
\item Lloyd Hugh Allen sent in a correction to Section 8.4.

\item Yvon Boulianne sent in a correction of a semantic error in
Chapter 5.

\item Fred Bremmer submitted a correction in Section 2.1.

\item Jonah Cohen wrote the Perl scripts to convert the
LaTeX source for this book into beautiful HTML.

\item Michael Conlon sent in a grammar correction in Chapter 2
and an improvement in style in Chapter 1, and he initiated discussion
on the technical aspects of interpreters.

\item Benoit Girard sent in a
correction to a humorous mistake in Section 5.6.

\item Courtney Gleason and Katherine Smith wrote {\tt horsebet.py},
which was used as a case study in an earlier version of the book.  Their
program can now be found on the website.

\item Lee Harr submitted more corrections than we have room to list
here, and indeed he should be listed as one of the principal editors
of the text.

\item James Kaylin is a student using the text. He has submitted
numerous corrections.

\item David Kershaw fixed the broken {\tt catTwice} function in Section
3.10.

\item Eddie Lam has sent in numerous corrections to Chapters
1, 2, and 3.
He also fixed the Makefile so that it creates an index the first time it is
run and helped us set up a versioning scheme.

\item Man-Yong Lee sent in a correction to the example code in
Section 2.4.

\item David Mayo pointed out that the word ``unconsciously"
in Chapter 1 needed
to be changed to ``subconsciously".

\item Chris McAloon sent in several corrections to Sections 3.9 and
3.10.

\item Matthew J. Moelter has been a long-time contributor who sent
in numerous corrections and suggestions to the book.

\item Simon Dicon Montford reported a missing function definition and
several typos in Chapter 3.  He also found errors in the {\tt increment}
function in Chapter 13.

\item John Ouzts corrected the definition of ``return value"
in Chapter 3.

\item Kevin Parks sent in valuable comments and suggestions as to how
to improve the distribution of the book.

\item David Pool sent in a typo in the glossary of Chapter 1, as well
as kind words of encouragement.

\item Michael Schmitt sent in a correction to the chapter on files
and exceptions.

\item Robin Shaw pointed out an error in Section 13.1, where the
printTime function was used in an example without being defined.

\item Paul Sleigh found an error in Chapter 7 and a bug in Jonah Cohen's
Perl script that generates HTML from LaTeX.

\item Craig T. Snydal is testing the text in a course at Drew
University.  He has contributed several valuable suggestions and corrections.

\item Ian Thomas and his students are using the text in a programming
course.  They are the first ones to test the chapters in the latter half
of the book, and they have made numerous corrections and suggestions.

\item Keith Verheyden sent in a correction in Chapter 3.

\item Peter Winstanley let us know about a longstanding error in
our Latin in Chapter 3.

\item Chris Wrobel made corrections to the code in the chapter on
file I/O and exceptions.

\item Moshe Zadka has made invaluable contributions to this project.
In addition to writing the first draft of the chapter on Dictionaries, he
provided continual guidance in the early stages of the book.

\item Christoph Zwerschke sent several corrections and
pedagogic suggestions, and explained the difference between {\em gleich}
and {\em selbe}.

\item James Mayer sent us a whole slew of spelling and
typographical errors, including two in the contributor list.

\item Hayden McAfee caught a potentially confusing inconsistency
between two examples.

\item Angel Arnal is part of an international team of translators
working on the Spanish version of the text.  He has also found several
errors in the English version.

\item Tauhidul Hoque and Lex Berezhny created the illustrations
in Chapter 1 and improved many of the other illustrations.

\item Dr. Michele Alzetta caught an error in Chapter 8 and sent
some interesting pedagogic comments and suggestions about Fibonacci
and Old Maid.

\item Andy Mitchell caught a typo in Chapter 1 and a broken example
in Chapter 2.

\item Kalin Harvey suggested a clarification in Chapter 7 and
caught some typos.

\item Christopher P. Smith caught several typos and helped us
update the book for Python 2.2.

\item David Hutchins caught a typo in the Foreword.

\item Gregor Lingl is teaching Python at a high school in Vienna,
Austria.  He is working on a German translation of the book,
and he caught a couple of bad errors in Chapter 5.

\item Julie Peters caught a typo in the Preface.

\item Florin Oprina sent in an improvement in {\tt makeTime},
a correction in {\tt printTime}, and a nice typo.

\item D.~J.~Webre suggested a clarification in Chapter 3.

\item Ken found a fistful of errors in Chapters 8, 9 and 11.

\item Ivo Wever caught a typo in Chapter 5 and suggested a clarification
in Chapter 3.

\item Curtis Yanko suggested a clarification in Chapter 2.

\item Ben Logan sent in a number of typos and problems with translating
the book into HTML.

\item Jason Armstrong saw the missing word in Chapter 2.

\item Louis Cordier noticed a spot in Chapter 16 where the code
didn't match the text.

\item Brian Cain suggested several clarifications in Chapters 2 and 3.

\item Rob Black sent in a passel of corrections, including some
changes for Python 2.2.

\item Jean-Philippe Rey at Ecole Centrale
Paris sent a number of patches, including some updates for Python 2.2
and other thoughtful improvements.

\item Jason Mader at George Washington University made a number
of useful suggestions and corrections.

\item Jan Gundtofte-Bruun reminded us that ``a error'' is an error.

\item Abel David and Alexis Dinno reminded us that the plural of
``matrix'' is ``matrices'', not ``matrixes''.  This error was in the
book for years, but two readers with the same initials reported it on
the same day.  Weird.

\item Charles Thayer encouraged us to get rid of the semi-colons
we had put at the ends of some statements and to clean up our
use of ``argument'' and ``parameter''.

\item Roger Sperberg pointed out a twisted piece of logic in Chapter 3.

\item Sam Bull pointed out a confusing paragraph in Chapter 2.

\item Andrew Cheung pointed out two instances of ``use before def''.

\item C. Corey Capel spotted the missing word in the Third Theorem
of Debugging and a typo in Chapter 4.

\item Alessandra helped clear up some Turtle confusion.

\item Wim Champagne found a brain-o in a dictionary example.

\item Douglas Wright pointed out a problem with floor division in
{\tt arc}.

\item Jared Spindor found some jetsam at the end of a sentence.

\item Lin Peiheng sent a number of very helpful suggestions.

\item Ray Hagtvedt sent in two errors and a not-quite-error.

\item Torsten H\"{u}bsch pointed out an inconsistency in Swampy.

\item Inga Petuhhov corrected an example in Chapter 14.

\item Arne Babenhauserheide sent several helpful corrections.

\item Mark E. Casida is is good at spotting repeated words.

\item Scott Tyler filled in a that was missing.  And then sent in
a heap of corrections.

\item Gordon Shephard sent in several corrections, all in separate
emails.

\item Andrew Turner {\tt spot}ted an error in Chapter 8.

\item Adam Hobart fixed a problem with floor division in {\tt arc}.

\item Daryl Hammond and Sarah Zimmerman pointed out that I served
up {\tt math.pi} too early.  And Zim spotted a typo.

\item George Sass found a bug in a Debugging section.

\item Brian Bingham suggested Exercise~\ref{exrotatepairs}.

\item Leah Engelbert-Fenton pointed out that I used {\tt tuple}
as a variable name, contrary to my own advice.  And then found
a bunch of typos and a ``use before def''.

\item Joe Funke spotted a typo.

\item Chao-chao Chen found an inconsistency in the Fibonacci example.

\item Jeff Paine knows the difference between space and spam.

\item Lubos Pintes sent in a typo.

\item Gregg Lind and Abigail Heithoff suggested Exercise~\ref{checksum}.

\item Max Hailperin has sent in a number of corrections and
  suggestions.  Max is one of the authors of the extraordinary {\em
    Concrete Abstractions}, which you might want to read when you are
  done with this book.

\item Chotipat Pornavalai found an error in an error message.

\item Stanislaw Antol sent a list of very helpful suggestions.

\item Eric Pashman sent a number of corrections for Chapters 4--11.

\item Miguel Azevedo found some typos.

\item Jianhua Liu sent in a long list of corrections.

\item Nick King found a missing word.

\item Martin Zuther sent a long list of suggestions.

\item Adam Zimmerman found an inconsistency in my instance
of an ``instance'' and several other errors.

\item Ratnakar Tiwari suggested a footnote explaining degenerate
triangles.

\item Anurag Goel suggested another solution for \verb"is_abecedarian"
and sent some additional corrections.  And he knows how to
spell Jane Austen.

\item Kelli Kratzer spotted one of the typos.

\item Mark Griffiths pointed out a confusing example in Chapter 3.

\item Roydan Ongie found an error in my Newton's method.

\item Patryk Wolowiec helped me with a problem in the HTML version.

\item Mark Chonofsky told me about a new keyword in Python 3.

\item Russell Coleman helped me with my geometry.

\item Wei Huang spotted several typographical errors.

\item Karen Barber spotted the the oldest typo in the book.

\item Nam Nguyen found a typo and pointed out that I used the Decorator
pattern but didn't mention it by name.

\item St\'{e}phane Morin sent in several corrections and suggestions.

\item Paul Stoop corrected a typo in \verb+uses_only+.

\item Eric Bronner pointed out a confusion in the discussion of the
order of operations.

\item Alexandros Gezerlis set a new standard for the number and
quality of suggestions he submitted.  We are deeply grateful!

\item Gray Thomas knows his right from his left.

\item Giovanni Escobar Sosa sent a long list of corrections and
suggestions.

\item Alix Etienne fixed one of the URLs.

\item Kuang He found a typo.

\item Daniel Neilson corrected an error about the order of operations.

\item Will McGinnis pointed out that {\tt polyline} was defined
differently in two places.

\item Swarup Sahoo spotted a missing semi-colon.

\item Frank Hecker pointed out an exercise that was under-specified, and
some broken links.

\item Animesh B helped me clean up a confusing example.

\item Martin Caspersen found two round-off errors.

\item Gregor Ulm sent several corrections and suggestions.

\item Dimitrios Tsirigkas suggested I clarify an exercise.

\item Carlos Tafur sent a page of corrections and suggestions.

\item Martin Nordsletten found a bug in an exercise solution.

\item Lars O.D. Christensen found a broken reference.

\item Victor Simeone found a typo.

\item Sven Hoexter pointed out that a variable named {\tt input}
shadows a build-in function.

\item Viet Le found a typo.

\item Stephen Gregory pointed out the problem with {\tt cmp}
in Python 3.

\item Matthew Shultz let me know about a broken link.

\item Lokesh Kumar Makani let me know about some broken links and some
changes in error messages.

\item Ishwar Bhat corrected my statement of Fermat's last theorem.

\item Brian McGhie suggested a clarification.

\item Andrea Zanella translated the book into Italian, and sent a
number of corrections along the way.

\item Many, many thanks to Melissa Lewis and Luciano Ramalho for
  excellent comments and suggestions on the second edition.

\item Thanks to Harry Percival from PythonAnywhere for his help
getting people started running Python in a browser.

\item Xavier Van Aubel made several useful corrections in the second
edition.

% ENDCONTRIB

\end{itemize}

\normalsize
\clearemptydoublepage

% TABLE OF CONTENTS
\begin{latexonly}

\tableofcontents

\clearemptydoublepage

\end{latexonly}